// 第一步 初始化我们的包
// 第二步 搭建服务器
// 引入
const http = require('http')
const app = http.createServer();
// 解析post请求数据
const querystring = require('querystring')
const url = require('url')
var modifyId = ''

// 连接数据库
const mongoose = require('mongoose')
mongoose.connect('mongodb://localhost/myraox', {
    useUnifiedTopology: true,
    useNewUrlParser: true
}).then(() => {
    console.log('数据库连接成功')
}).catch(err => {
    console.log(err, '数据库连接失败')
})
// 创建集合规则
const userSchema = new mongoose.Schema({
    name: {
        type: String,
        required: true,
        minlength: [2, '最小值不能小于2'],
        maxlength: [100, '最大值不能超过100']
    },
    age: {
        type: Number,
        min: [5, '年龄不能小于5岁'],
        max: [100, '年龄不能超过100岁']
    },
    sex: String,
    email: String,
    hobbies: [String],
    collage: String,
    enterDate: {
        type: Date,
        default: Date.now
    }
})
// 根据集合规则创建集合表
const myUser = mongoose.model('Myuser', userSchema);
// 安装模板引擎 art-template
// 引入
const template = require('art-template')
// 引入path
const path = require('path')
// 配置根路径
template.defaults.root = path.join(__dirname, 'views')

// 格式化时间
// 1 安装第三方模块
// 2 引入 dateformat
// 3 自定义格式化方法
const dateFormat = require('dateformat')
template.defaults.imports.myformat = dateFormat

// 静态资源托管 
// 引入 serve-static
// 静态资源挂载
const serveStatic = require('serve-static')
// 进行静态资源托管
const serve = serveStatic(path.join(__dirname, 'public'))


// 实现node js路由(调用第三方模块)
// 引入router
const Router = require('router')
// 调用返回值
const router = Router()
// 测试路由功能(监听路由)
// 路由进行挂载 需要挂载在服务器上
router.get('/list', async (req, res) => {
    //list 路由 
    /* 
     get /list路由
    1 从数据库中读取数据 find
    2 把读取道德数据采用模板引擎展示出来
    */
    var allData = await myUser.find()
    console.log(allData)
    var obj = {
        myallData: allData
    }
    var html = template('list.art', obj)
    res.end(html)
})
router.get('/add', (req, res) => {
    // get请求
    //template('第一个参数是需要加载的模板路径', '第二个参数是我们需要加载的数据')
    var html = template('index.art', {})
    res.end(html)
})
// get 提交req.url
// post 提交 特别是表单提交 一定要有name属性
router.post('/add', (req, res) => {
    // post 请求提交数据
    let formData = ''
    req.on('data', (params) => {
        formData += params
    })
    req.on('end', async () => {
        // console.log(formData);
        var data = querystring.parse(formData);
        // console.log(data)
        // 向数据库里面添加数据
        // 写法一
        // myUser.create(data).then(res => {
        //     console.log(res);
        // })

        // 写法二
        let successData = await myUser.create(data);
    })
    // 跳转到/list 路由 301 重定向到/list
    res.writeHead(301, {
        Location: '/list'
    })
    res.end()
})


// 删除功能
router.get('/remove', async (req, res) => {
    // 1 获取当前传递过来的id
    // 2 根据id 去数据库里面查询 找到对应的进行删掉
    // 3 重新跳转到/list 路由 
    const myid = url.parse(req.url, true).query.id
    let delData = await myUser.findOneAndDelete({
        _id: myid
    })
    // 重定向完了之后 必须要加上res.end()
    res.writeHead(301, {
        Location: '/list'
    })
    res.end()
})

// 修改功能
// 第一部分 把之前的值进行渲染
router.get('/modify', async (req, res) => {
    // get
    // 1 获取get 传递过来的id
    // 2 根据id去数据库查询对应的数据
    // 3 把查询出来的数据 通过模板引擎 进行展示
    modifyId = url.parse(req.url, true).query.id
    // console.log(myid)c
    let findData = await myUser.findOne({
        _id: modifyId
    })
    let html = template('index2.art', findData)
    // console.log(html)
    res.end(html)
})

// 第二部分 更新新值
router.post('/modify', (req, res) => {
    let myid = modifyId
    console.log(myid)
    let formData = ''
    req.on('data', (params) => {
        formData += params
    })
    req.on('end', async () => {
        let obj = querystring.parse(formData)
        let modifyRes = await myUser.updateOne({
            _id: myid
        },obj)
        res.writeHead(301, {
            Location: '/list'
        })
        res.end()
    })
})




app.on('request', (req, res) => {
    router(req, res, () => {
        // console.log('路由触发了')
    })
    serve(req, res, () => { //这个函数必须要有可以什么都不写
        // console.log('css静态资源托管');
    })
    // res.end('ok')
})
app.listen(8888, () => {
    console.log('http://localhost:8888');
})
